#ifndef __UDSF_APP_SWITCH_C__
#define __UDSF_APP_SWITCH_C__

#include "app.h"

/*
*   notice:
*   UDSF 同UDF编程：不可调用cstd-lib,只可调用"sdk_ifs_udk_cfg.h"、"sys_api.h"中列出的API函数。
*   UDSF文件内函数均需使用static修饰符，且UDF中以#include "udsf_xxx.c"形式引用
*/

/*
note:
app切换,UDKv3 主APP的DATA分区内可放置多个独立app，使用本文件内相关函数可实现app切换。
udk内未提供独立app数据交互标准方法，用户可自行在CPU_SRAM/BBE_SRAM内约定实现
*/

#include "udsf_crc.c"
#include "udsf_memory_access.c"

static void udsf_app_switch(uint32_t udp_addr_offset_nvm,uint8_t is_xip,uint8_t app_location,uint8_t ab_area_offset,uint32_t ab_app_offset) __attribute__((unused));

/*
*  udp_addr_offset_nvm  app存储的起始地址
*  is_xip               xip启动标识
*  app_location         app位置(内部/外部)
*  ab_offset            ab区标识
*  ab_app_offset        ab区大小
*/
static void udsf_app_switch(uint32_t udp_addr_offset_nvm,uint8_t is_xip,uint8_t app_location,uint8_t ab_area_offset,uint32_t ab_app_offset){

	//CSTD_PRINTF("%08x,%d,%d,%d,%08x\n",udp_addr_offset_nvm,is_xip,app_location,ab_area_offset,ab_app_offset);
	if( ab_area_offset > APP_PLACE_A_AREA ){
		udp_addr_offset_nvm += ab_app_offset;
	}

	udsf_memory_load2sram(udp_addr_offset_nvm,is_xip,app_location,(uint8_t*)UDP_ADDR,UDP_SIZE,eQSPI_FLASH_STD);
	uint32_t offset = udp_addr_offset_nvm;
	
	if( app_location == APP_LOCATION_OUTER ){
		offset -= SYSBOOT_APP_BASE_OUTER;
	}else{
		offset -= SYSBOOT_APP_BASE_INNER;
	}
	if( offset ){
		UDF_INFO * udf_info = &paramFunc->udf01_info;
		for( int i=0;i<UDF_MAX_NUM;i++ ){
			udf_info[i].srcAddr += offset;
		}
		uint16_t crc = udsf_get_crc((uint8_t *)paramFunc,paramFunc->crcLen+2);
		paramFunc->crcVal = crc;
	}

	*p_rom_app_offset = offset;
	paramRT->switch_flag = 1;
}

#endif
